/*
 * @Author: your name
 * @Date: 2022-02-04 17:05:01
 * @LastEditTime: 2022-02-04 22:28:44
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: \ts\12联合类型和类型保护.ts
 */

// 所谓联合类型，可以认为一个变量可能有两种或两种以上的类型。

interface teacher {
    isTea:boolean;
    name: string;
    jiaoshu():void;
}
interface student {
    sno:number
    dushu():void
}

function people1 (p:teacher|student) {
    //  p.jiaoshu() // 直接这样写不行，无法判断是哪个
}

// 类型断言

// 访问公共属性name没问题
interface Cat {
    name:string;
    run():void;
}
interface Fish {
    name:string;
    swim():void;
}
function getName(animal:Cat|Fish):string{
    return animal.name;
}

// 但是访问两者没有一致的属性就要断言

function people2 (p1:(teacher | student)) {
    if((p1 as teacher).jiaoshu) {
     (p1 as teacher).jiaoshu() // 通过判断是否有对应值

    }else {
        (p1 as student) .dushu()

    }
}


// in 语法 , 判断是否包含对应属性或方法
function people3 (p1:(teacher | student)) {
  if('isTea' in p1) {
      p1.jiaoshu()
  }else {
      p1.dushu()
  }
}

// 类型typeof语法

function fun4 (one:number|string, two: number|string):(number|string) {
    // return one + two  //直接这样报错

    // return `${one}-${two}`

   if(typeof one === 'string' || typeof two === 'string') {
       return `${one}-${two}`
    // return one + two // 这里也不能直接加
   }else {
       return one +two
   }
  }


  // instanceof,只能作用 于类
  
  class instanC {
      name:string
  }
  function addObj (a:object|instanC, b:instanC) {
      if(a instanceof instanC) {
        return a.name + b.name
      }else {
          return b.name
      }
  }


// 断言成any-只是想给window添加一个属性，但因为window上并没有a属性，所以报错。此时，就需要将window断言为any：
// window.a = 'df'
(window as any).a = 'df'


let obj201 = {}

// obj201.a = 56 // 不存在不给加